package com.smarthospital.common.util;

import com.smarthospital.common.Result.CodeMsg;
import com.smarthospital.common.Result.CommonException;
import com.smarthospital.contants.SHConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * create by sym  2021/5/23 17:43.
 */
@Slf4j
public class IDGeneratorUtil {

    private static StringRedisTemplate stringRedisTemplate;

    public static String getOneceString(){
        return generateId(SHConst.redis_key.getOneceString,10);
    }
    /**
     * 生成10位退货id
     * @return
     */
    public static String generateRefundsId(){
        return generateId(SHConst.redis_key.generateRefundsId,10);
    }

    /**
     * 生成消息id
     * @return
     */
    public static String generateImmessageId(){
        return generateId(SHConst.redis_key.generateImmessageId,10);
    }
    /**
     * 生成10位注册id  年后2位月份日期+redis自增id 不足4位的补全
     * @return
     */
    public static String getRegistId(){
        return generateId(SHConst.redis_key.getRegistId,10);
    }

    /**
     * 生成报告id
     * 未连接医院
     * @return
     */
    public static String getReportId(){
        return generateId(SHConst.redis_key.getReportId,6);
    }

    /**
     * 生成微信支付id（）
     * 微信支付未实现
     * @return
     */
    public static String getWxPayId(){
        return generateId(SHConst.redis_key.getWxPayId,10);
    }


    /**
     * 生成腾讯聊天房间id
     * 一天一万单应该够了
     * @return
     */
    public static String generateTRTCRoomId(){
        return generateId(SHConst.redis_key.generateTRTCRoomId,4);
    }

    /**
     * 抽离一个方法  合理抽离方法可以降低代码重复率
     * @return
     */
    private static String generateId(String key,int length){
        if (stringRedisTemplate == null) {
            stringRedisTemplate = SpringContextUtil.getApplicationContext().getBean(StringRedisTemplate.class);
            if (stringRedisTemplate == null){
                log.error("IDGeneratorUtil redisTemplate 启动失败");
                throw new CommonException(CodeMsg.ERROR_LOGIN);
            }
        }

        Long increment = stringRedisTemplate.opsForValue().increment(key, 1L);
        //设置过期时间  设置到当天晚上23.59点   这里可以判断不是第一次就不需要重置时间
        if (increment == 1) {
            stringRedisTemplate.expire(key,secondsRemain(),TimeUnit.SECONDS);
        }
        String string = SHStringUtil.complString(increment+"", length, "0");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dateStr = sdf.format(new Date());
        String subdateStr = dateStr.substring(2, dateStr.length());
        String id = subdateStr + string;
        log.info("IDGeneratorUtil generateId key {} id {}",key,id);
        return id;
    }



    //当天晚上23.59点 到现在还有多少秒
    private static Long secondsRemain() {
        long now = System.currentTimeMillis() / 1000;
        LocalDateTime midNight = LocalDateTime.of(LocalDate.now(),LocalTime.of(23,59,59));
        //我们这里是东八区
        long l = midNight.toEpochSecond(ZoneOffset.ofHours(8));
        return l-now;
    }

}
